iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 5

IT 邦鐵人賽 Day 5 - Interfaces

  • 分享至 

  • xImage
  •  

介面(Interfaces)

終於來到介面的部分囉!
我覺得在介紹什麼是介面之前,可以先來個情境...餐廳

Ken: Waiter,我需要個菜單(介面),來決定我要吃什麼(決定什麼行為或者介面)

Waiter: 沒問題,我們這裡有提供鳳梨蝦球、糖醋排骨...


揪都馬爹~ 為什麼直接聊到了API(Application Programming Interface)呢?

因為我今天就是來講這個 I 的!!!/images/emoticon/emoticon01.gif

說實話,一開始看到介面時,我真的一點概念都沒有,覺得這兩個字好抽象,但後來理解後,我才發現這真的只能用介面這兩個字來表示。 但我其實更喜歡說的是行為

在Ruby的類別中,包含著許多方法,而這些方法可以使用三個關鍵字來區分 Public Protected Private

因此介面又可分為公共介面(Public)與私有介面(Private)兩類,而Protected提供的介面則表示"謹慎使用"(就文字意義上)。

回到我一開始的情境關係,餐廳裡面所提供的菜單,指的就是公共介面,而廚房內部的料理過程(或稱細節)就是所謂的私有介面

公共介面在軟體內,是指一個類別內的方法們,可以讓外部安心使用(或者稱作穩定)
私有介面則是指不給外部做使用(因為不穩定),而是在自己類別內,進行細節處理(比如公共介面內,會需要私有介面內的方法來做數據處理)


如何設計介面

一個好的介面,需要可以接受各種訊息,若是指能給特定的類別使用或者只接受特定資料,那麼介面就毫無彈性可言,明顯是嚴重耦合
換言之,一個好的介面,並不會介意今天收到什麼參數,而是不管什麼參數,都可以執行獲得結果(這句話是不是很像... 鴨子型別啊),如果不熟悉的人,可以看看先前文章的解耦,使用依賴注入,就可以增加方法(介面)的彈性。

用介面來設計物件

當專案成立new出來時,不知道大家都是怎麼決定類別與其關係的,或許都是使用SRP來決定類別,但實際上這遠遠不夠,而是要利用傳遞訊息的關係來發現物件。

這或許有點抽象,在Sandi Metz著作中的例子中表示,有一項需求是客戶需要自行車旅行團,很直覺的想法是有兩個類別可以先建立起來(從文字上看出),客戶與旅行團。
但仔細思考後發現,若是從物件角度去思考時,就有些不太一樣,像是顧客需要旅行團準備好自行車,那麼顧客會跟旅行團確認旅程(確認這個動作就是訊息傳遞)
但旅行團要跟誰確認好自行車準備好了? 是旅行團自己嗎?
絕對不是,因為這違反了SRP!

所以這個時候再多建立一個類別去負責自行車的準備(可能是自行車店之類的)
這時旅行團就知道跟誰確認
簡言之,思考訊息要傳送給誰(誰要使用介面)來決定說有哪些類別的存在。
這樣的思考模式會更像是物件導向(因為重點在於操作訊息或者說是行為展現

今天就先分享完介面的基礎概念吧! 明天終於可以解釋 鴨子型別 囉~

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 4 - Dependencies
下一篇
IT 邦鐵人賽 Day 6 - Duck Typing
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Mike_Lai
iT邦新手 4 級 ‧ 2022-09-21 11:50:42

呱呱

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-09-22 20:15:41

鴨子呱呱

我要留言

立即登入留言